﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;

namespace 实体跟踪
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using(var db=new MyContext())
            {
                var artitles = db.Articles.ToArray();

                var a1= artitles[0];
                var a2= artitles[1];
                var a3= artitles[2];

                var a4 = new Article { Title = "新文章", Message = "新内容" };
                var a5 = new Article { Title= "新文章2", Message = "新内容2" };

                //修改a1，移除a2, a3不变，添加a4, a5不管。
                a1.Message = "修改过的内容";
                db.Articles.Remove(a2);
                db.Articles.Add(a4);

                EntityEntry e1 = db.Entry(a1);
                EntityEntry e2 = db.Entry(a2);
                EntityEntry e3 = db.Entry(a3);
                EntityEntry e4 = db.Entry(a4);
                EntityEntry e5 = db.Entry(a5);

                Console.WriteLine(e1.State);
                Console.WriteLine(e1.DebugView.LongView);
                Console.WriteLine(e2.State);
                Console.WriteLine(e3.State);
                Console.WriteLine(e4.State);
                Console.WriteLine(e5.State);


                Console.WriteLine("==================");
                //如果查询出来的对象只是用来显示，不打算修改，可以使用AsNoTracking方法，提升查询性能，降低内存使用。
                //使用AsNoTracking查询的实体，状态是Detached1，不会被跟踪。之后使用saveChanges也不会保存这些实体的修改。
                //数据库的数据不会被修改。

                var arts2 = db.Articles.AsNoTracking().ToArray();
                var b1 = arts2[0];
                b1.Title= "尝试修改标题";
                Console.WriteLine(db.Entry(b1));

            }
        }
    }
}
